package com.heima.controller.filter;


import com.alibaba.fastjson.JSON;


import com.heima.controller.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Slf4j
@WebFilter("/*") // 拦截所有请求
public class LoginCheckFilter implements Filter {

    //创建路径匹配器对象 检查是否在放行范围
    AntPathMatcher apm = new AntPathMatcher();

    @Value("${urlStr}")
    String urlStr;

    //判断是否登录 并确定是否放行
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        String[] urls = urlStr.split(",");
        //获取本次uri
        HttpServletRequest req = (HttpServletRequest) servletRequest;
//        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        String requestURI = req.getRequestURI();
        //判断是否需进行拦截  如果是静态页面或者登录界面 则不需要进行拦截

        //你是否有同行 是否在免费的同行范围内
        boolean flag = checkUrl(urls, requestURI);
        //如果你在范围内
        if (flag) {
            //放行
            filterChain.doFilter(servletRequest, servletResponse);
            return; //直接结束
        }
        //如果你不是正常访问进来的 判断你有没有 session Id
        //域名后面的东西
        //判断登录状态 如果已经登录 则 直接放行
//        HttpSession session = req.getSession();
//        Long empoyeeId = (Long) session.getAttribute("employee");

        //进行设置


//        //没有进行session存储
//        if (empoyeeId != null) {
//            // 通过ThreadLocal对象，为当前线程绑定一个值.
//            // 因为所有请求都会过Filter，在这里设置好之后，
//            // 之后在dao/service/Controller等位置所有同一个线程中都可以获取并使用
//            BaseContext.setCurrentId(empoyeeId);
//            //放行
//            filterChain.doFilter(servletRequest, servletResponse);
//          return;
//        }
//
//
        servletResponse.getWriter().write(JSON.toJSONString(R.fail("NOTLOGIN")));

    }

    //判断是否在
    private boolean checkUrl(String[] urls, String requestURI) {
        boolean mathResult = false;

        for (String url : urls) {
            mathResult = apm.match(url, requestURI);
            if (mathResult) {
                return true;

            }
        }
        log.info("本次请求url为：{} ，是否需要放行{}", requestURI, false);
        return false;
    }
}


